package core

import (
	"fmt"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"sheep_script/global"
	"time"
)

var infoLogFile *os.File
var errorLogFile *os.File
var err error

// 获取当前日期的日志文件名
func getLogFileName() (filename string) {
	// 日志文件目录
	dirPath := fmt.Sprintf(global.Config.Logger.Director+"/%s", time.Now().Format("2006-01-02"))
	// 判断目录是否存在
	_, err := os.Stat(dirPath)
	if os.IsNotExist(err) {
		// 目录不存在，创建目录
		err := os.MkdirAll(dirPath, 0755)
		if err != nil {
			fmt.Printf("Failed to create directory: %v\n", err)
			return
		}
	} else if err != nil {
		// 发生其他错误
		fmt.Printf("Error checking directory: %v\n", err)
		return
	}

	filename = dirPath + "/info.log"
	// 当前日期，格式化为 yyyy-mm-dd
	return
}

// 获取当前日期的错误日志文件名
func getErrorLogFileName() (filename string) {
	// 日志文件目录
	dirPath := fmt.Sprintf(global.Config.Logger.Director+"/%s/", time.Now().Format("2006-01-02"))
	// 判断目录是否存在
	_, err := os.Stat(dirPath)
	if os.IsNotExist(err) {
		// 目录不存在，创建目录
		err := os.MkdirAll(dirPath, 0755)
		if err != nil {
			fmt.Printf("Failed to create directory: %v\n", err)
			return
		}
	} else if err != nil {
		// 发生其他错误
		fmt.Printf("Error checking directory: %v\n", err)
		return
	}

	filename = dirPath + "error.log"
	return
}

// Zap 初始化日志记录器
func Zap() *zap.Logger {
	// 创建 info 日志文件，以追加模式打开
	infoLogFile, err = os.OpenFile(getLogFileName(), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		panic(err)
	}

	// 创建 error 日志文件，以追加模式打开
	errorLogFile, err = os.OpenFile(getErrorLogFileName(), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		panic(err)
	}

	// 创建 info 日志编码器
	infoEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

	// 创建 error 日志编码器
	errorEncoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

	// 创建 info 日志写入器
	infoWriter := zapcore.AddSync(infoLogFile)

	// 创建 error 日志写入器
	errorWriter := zapcore.AddSync(errorLogFile)

	// 创建 core
	infoCore := zapcore.NewCore(infoEncoder, infoWriter, zap.InfoLevel)
	errorCore := zapcore.NewCore(errorEncoder, errorWriter, zap.ErrorLevel)

	// 创建 logger
	logger := zap.New(zapcore.NewTee(infoCore, errorCore))
	defer logger.Sync()
	return logger
}

func CheckDate() {
	// 记录当前日期
	currentDate := time.Now().Format("2006-01-02")
	// 创建一个每秒触发一次的定时器
	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()

	for {
		select {
		case <-ticker.C:
			newDate := time.Now().Format("2006-01-02")
			if newDate != currentDate {
				fmt.Printf("日期从 %s 变为 %s\n", currentDate, newDate)
				currentDate = newDate
				writerClose()
				global.Logger = Zap()
			}
		}
	}

	//for {
	//	select {
	//	case <-time.Tick(time.Second):
	//		if lastLogDate != time.Now().Format("2006-01-02") {
	//			writerClose()
	//			global.Logger = Zap()
	//		}
	//	}
	//}
}

func writerClose() {
	// 关闭日志文件
	err = infoLogFile.Close()
	if err != nil {
		panic(err)
	}
	err = errorLogFile.Close()
	if err != nil {
		panic(err)
	}
}

func InitLogger() *zap.Logger {
	// 验证日期
	go CheckDate()
	return Zap()
}
